package com.fsgom.common.util;

import java.net.URLDecoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;

import org.apache.log4j.Logger;

public final class CommonUtils {
	protected	final static TimeZone 	tz 	 = TimeZone.getTimeZone("GMT+09:00");
	private final static Logger log = Logger.getLogger(CommonUtils.class);
	
	/**
	 * UTF-8으로 인코딩된 스트링을 디코딩한다.
	 * 디코딩 시, 특수문자(%, +)가 있으면 오류가 나지 않도록 처리한다.
	 * @param oriString
	 * @return String
	 */
	public static String getDecodeUTF8(String oriString) {
		String resultTxt = "";
		try {      
			StringBuffer tempBuffer = new StringBuffer();      
			int incrementor = 0;     
			int dataLength = oriString.length();      
			while (incrementor < dataLength) {         
				char charecterAt = oriString.charAt(incrementor);         
				if (charecterAt == '%') {           
					tempBuffer.append("<percentage>");        
				} else if (charecterAt == '+') {            
					tempBuffer.append("<plus>");        
				} else {           
					tempBuffer.append(charecterAt);        
				}        
				incrementor++;      
			}
			resultTxt = tempBuffer.toString();     
			resultTxt = URLDecoder.decode(resultTxt, "UTF-8");      
			resultTxt = resultTxt.replaceAll("<percentage>", "%");      
			resultTxt = resultTxt.replaceAll("<plus>", "+");  
		} catch (Exception e) {      
			log.error(e.getMessage(), e);
		} 
 		return resultTxt;
	}
	
	/**
	 * 텍스트 길이 체크
	 * @param minLen
	 * @param maxLen
	 * @param txt
	 * @return
	 */
	public static boolean isCheckTxtLength(int minLen, int maxLen, String txt) {
		if ( minLen <= txt.trim().length() &&  txt.trim().length() <= maxLen ) {
			return true;
		}
		return false;
	}
	
	/**
	 * 입력한 특정일을 지났는지 확인
	 * @param ymd = "비교일 : yyyyMMdd"
	 * @return boolean
	 */
	public static boolean isYmdOver(String ymd) {
		String today = getNowToFormat("yyyyMMdd");
		boolean isLessEndYmd = today.compareTo(ymd) <= 0;
		if (isLessEndYmd) {
			return false;
		}
		return true;
	}
	
	/**
	 * 특정 기간에 속해 있는지를 체크
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public static boolean isCheckTerm(String startDate, String endDate) {
		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmm", Locale.KOREA);
		long thisTime	=	System.currentTimeMillis();
		try {
			Date startDt	= df.parse(startDate);
			Date endDt		= df.parse(endDate);
			long startTime	=	startDt.getTime();
			long endTime	=	endDt.getTime();
			if (startTime <= thisTime && thisTime <= endTime) {
				return true;
			}
		} catch (ParseException e) {
			log.error(e.getMessage(), e);
		}
		return false;
	}
	
	/**
	 * 문자열의 순서를 뒤집는다
	 * @param s
	 * @return String
	 */
    public static String getRevString(String s) {
        return new StringBuffer(s).reverse().toString();
    }
	
	/**
	 * 천단위 마다 콤마를 찍는다
	 * @param number
	 * @return String
	 */
	public static String getCommaString(int number) {
		String str	= Integer.toString(number);
        String temp = getRevString(str);
        String result = "";
        for (int i = 0 ; i < temp.length() ; i += 3) {
            if (i + 3 < temp.length()) {
                result += temp.substring(i, i + 3) + ",";
            } else {
                result += temp.substring(i);
            }
        }
        return getRevString(result);
    }
	
	/**
     * 현재 시간을 지정하는 포맷에 맞춰 구한다
     * @param format
     * @return String
     */
    public static String getNowToFormat(String format) {
    	SimpleDateFormat df = new SimpleDateFormat(format, Locale.KOREA);
		Calendar cal = GregorianCalendar.getInstance(tz);
		long thisTime	=	cal.getTimeInMillis();
		return df.format(thisTime);
    }
    
    /**
	 * 현재 시간이 특정 시간을 지났는지를 체크
	 * 
	 * @param hour
	 * @return
	 */
	public static boolean isAvailTime(int hour) {
		Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT+9"));
		int thisHour	=	cal.get(Calendar.HOUR_OF_DAY);
		if ( hour <= thisHour ) {
			return true;
		}
		return false;
	}
	
	/**
	 * 한글 체크하여 문자열을 자른다 (3byte 처리)
	 * 오라클에서의 한글 길이를 맞추기 위함
	 * @param inputStr = "대상문자열"
	 * @param limit = "길이"
	 * @param fixStr = "자른 나머지 대체문자. 말줄임표 등등"
	 * @return
	 */
	public static String subString3byte(String inputStr, int limit, String fixStr) { 
        if (inputStr == null)	{
            return "";
        }
        if (limit <= 0)	{
            return inputStr;
        }
        char[] charArray = inputStr.toCharArray();
        int checkLimit = 0;
        int	end	=	0;
        for (int i = 0 ; i < charArray.length ; i++) {
        	if (charArray[i] < 256) {
        		checkLimit += 1;
        	} else {
        		checkLimit += 3;
        	}
        	if (checkLimit >= limit && charArray[i] < 256) {
        		end = i - 1;
        		break;
        	} else if (checkLimit >= limit) {
        		end = i;
        		break;
        	}
        }
        if (end ==0) {
        	return inputStr;
        }
        if (fixStr == null) {
        	return inputStr.substring(0, end);
        }
        return inputStr.substring(0, end)+fixStr;
	}
	
	/**
	 * n일 후의 날짜를 특정포맷에 맞춰 구한다.
	 * 일 단위로 정한다.
	 * @param format = 날짜 포맷
	 * @param day = 현재로부터 몇일 뒤를 구할것인지 정의. 오늘은 0
	 * @return
	 */
	public static String getDate(String format, long day) {
		SimpleDateFormat df = new SimpleDateFormat(format, Locale.KOREA);
		Calendar cal = GregorianCalendar.getInstance(tz);
		long getTime	= cal.getTimeInMillis() + (86400000 * day);
		return df.format(getTime);
	}
}
